package me.yuxiaoyao.jpa.nativesql.mapper;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * @author kerryzhang on 2020/12/16
 */


class AutoMapper implements JpaMapper {


    @Override
    public Object mapper(Object sqlValue, Class<?> entityClassType, Class<?> fieldClassType) {
        if (sqlValue == null) {
            return ReflectUtil.getClassDefaultValue(fieldClassType);
        }
        Class<?> sqlObjectClassType = sqlValue.getClass();
        if (sqlObjectClassType == fieldClassType) {
            // 同类型
            return sqlValue;
        }
        if (sqlValue instanceof String) {
            if (fieldClassType == Integer.class) {
                return Integer.parseInt(sqlValue.toString());
            } else if (fieldClassType == Long.class) {
                return Long.parseLong(sqlValue.toString());
            }
        } else if (sqlValue instanceof BigInteger) {
            if (fieldClassType == Integer.class) {
                return ((BigInteger) sqlValue).intValue();
            } else if (fieldClassType == Long.class) {
                return ((BigInteger) sqlValue).longValue();
            } else if (fieldClassType == Short.class) {
                return ((BigInteger) sqlValue).shortValue();
            }
            return sqlValue;
        } else if (sqlValue instanceof BigDecimal) {
            if (fieldClassType == Integer.class) {
                return ((BigDecimal) sqlValue).intValue();
            } else if (fieldClassType == Long.class) {
                return ((BigDecimal) sqlValue).longValue();
            } else if (fieldClassType == Short.class) {
                return ((BigDecimal) sqlValue).shortValue();
            }
            return sqlValue;
        } else if (sqlValue instanceof java.sql.Date) {
            // java.sql.Date
            if (fieldClassType == LocalDate.class) {
                return MapperConfiguration.getSqlDateConverter().sqlDateToLocalDate((Date) sqlValue);
            }
        } else if (sqlValue instanceof java.sql.Timestamp) {
            // java.sql.Timestamp
            if (fieldClassType == java.util.Date.class) {
                return MapperConfiguration.getSqlDateConverter().sqlTimestampToDate((Timestamp) sqlValue);
            } else if (fieldClassType == LocalDateTime.class) {
                return MapperConfiguration.getSqlDateConverter().sqlTimestampToLocalDateTime((Timestamp) sqlValue);
            }
        } else if (sqlValue instanceof Boolean) {
            if (Number.class.isAssignableFrom(fieldClassType)) {
                // true = 1 or false = 0
                byte i = (byte) (((Boolean) sqlValue) ? 1 : 0);
                return fieldClassType.cast(i);
            }
        }
        return sqlValue;
    }
}
